package com.x.utils;

import java.util.Random;

/**
 * <p>
 * Description:密码生成工具
 * </p>
 * 
 * @Author Chenkangming
 * @Date 2015年12月10日
 * @version 1.0
 */
public class PasswordUtil {
	/**
	 * 生成密码
	 * 
	 * @return
	 */
	public static String createPasswd(int len) {
		StringBuffer sb = new StringBuffer("a,b,c,d,e,f,g,h,i,g,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z");
		sb.append(",A,B,C,D,E,F,G,H,I,G,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z");
		sb.append(",~,@,#,$,%,^,&,*,(,),_,+,|,`,.,=,>,<,?");
		sb.append(",1,2,3,4,5,6,7,8,9,0");

		String[] arr = sb.toString().split(",");

		return getPwd(arr, len);
	}

	private static String getPwd(String[] arr, int len) {
		StringBuffer sb = new StringBuffer();
		Random r;
		int k;
		for (int i = 0; i < len; i++) {
			r = new Random();
			k = r.nextInt();
			sb.append(String.valueOf(arr[Math.abs(k % 76)]));
		}
		return sb.toString();
	}

	/************* 密码强度检测工具 ***************/

	public enum Safelevel {
		VERY_WEAK("非常弱"), WEAK("弱"), AVERAGE("一般"), STRONG("强"), VERY_STRONG("非常强"), SECURE("安全"), VERY_SECURE("非常安全");

		private String value;

		public String getValue() {
			return value;
		}

		private Safelevel(String value) {
			this.value = value;
		}
	}

	public static Safelevel getPwdLevel(String pwd) {
		Safelevel slv = Safelevel.VERY_WEAK;
		if (pwd == null) {
			return slv;
		}

		int grade = 0;
		int index = 0;
		char[] pPsdChars = pwd.toCharArray();

		int numIndex = 0;
		int sLetterIndex = 0;
		int lLetterIndex = 0;
		int symbolIndex = 0;

		for (char pPsdChar : pPsdChars) {
			int ascll = pPsdChar;
			/*
			 * 数字 48-57 A-Z 65 - 90 a-z 97 - 122 !"#$%&'()*+,-./ (ASCII码：33~47)
			 * :;<=>?@ (ASCII码：58~64) [\]^_` (ASCII码：91~96) {|}~
			 * (ASCII码：123~126)
			 */
			if (ascll >= 48 && ascll <= 57) {
				numIndex++;
			} else if (ascll >= 65 && ascll <= 90) {
				lLetterIndex++;
			} else if (ascll >= 97 && ascll <= 122) {
				sLetterIndex++;
			} else if ((ascll >= 33 && ascll <= 47) || (ascll >= 58 && ascll <= 64) || (ascll >= 91 && ascll <= 96) || (ascll >= 123 && ascll <= 126)) {
				symbolIndex++;
			}
		}
		/*
		 * 一、密码长度: 5 分: 小于等于 4 个字符 10 分: 5 到 7 字符 25 分: 大于等于 8 个字符
		 */
		if (pPsdChars.length <= 4) {
			index = 5;
		} else if (pPsdChars.length <= 7) {
			index = 10;
		} else {
			index = 25;
		}
		grade += index;

		/*
		 * 二、字母: 0 分: 没有字母 10 分: 全都是小（大）写字母 20 分: 大小写混合字母
		 */
		if (lLetterIndex == 0 && sLetterIndex == 0) {
			index = 0;
		} else if (lLetterIndex != 0 && sLetterIndex != 0) {
			index = 20;
		} else {
			index = 10;
		}
		grade += index;
		/*
		 * 三、数字: 0 分: 没有数字 10 分: 1 个数字 20 分: 大于 1 个数字
		 */
		if (numIndex == 0) {
			index = 0;
		} else if (numIndex == 1) {
			index = 10;
		} else {
			index = 20;
		}
		grade += index;

		/*
		 * 四、符号: 0 分: 没有符号 10 分: 1 个符号 25 分: 大于 1 个符号
		 */
		if (symbolIndex == 0) {
			index = 0;
		} else if (symbolIndex == 1) {
			index = 10;
		} else {
			index = 25;
		}
		grade += index;
		/*
		 * 五、奖励: 2 分: 字母和数字 3 分: 字母、数字和符号 5 分: 大小写字母、数字和符号
		 */
		if ((sLetterIndex != 0 || lLetterIndex != 0) && numIndex != 0) {
			index = 2;
		} else if ((sLetterIndex != 0 || lLetterIndex != 0) && numIndex != 0 && symbolIndex != 0) {
			index = 3;
		} else if (sLetterIndex != 0 && lLetterIndex != 0 && numIndex != 0 && symbolIndex != 0) {
			index = 5;
		}
		grade += index;

		/*
		 * 最后的评分标准: 
		 * >= 90: 非常安全
		 *  >= 80: 安全（Secure）
		 *  >= 70: 非常强 
		 *  >= 60: 强（Strong） 
		 *  >= 50: 一般（Average） 
		 *  >= 25: 弱（Weak） 
		 *  >= 0: 非常弱
		 */
		if (grade >= 90) {
			slv = Safelevel.VERY_SECURE;
		} else if (grade >= 80) {
			slv = Safelevel.SECURE;
		} else if (grade >= 70) {
			slv = Safelevel.VERY_STRONG;
		} else if (grade >= 60) {
			slv = Safelevel.STRONG;
		} else if (grade >= 50) {
			slv = Safelevel.AVERAGE;
		} else if (grade >= 25) {
			slv = Safelevel.WEAK;
		} else if (grade >= 0) {
			slv = Safelevel.VERY_WEAK;
		}
		return slv;
	}

	public static void main(String[] args) {
		String pwd = createPasswd(20);
		System.out.println("密码：" + pwd);
		Safelevel lv = getPwdLevel(pwd);
		System.out.println("强度：" + lv.getValue());
	}
}
